본문으로 건너뛰기

데이터 타입

질문 List

데이터 타입 🔥

  1. 데이터 타입의 종류는 어떤 것들이 있나요? 🔥
  2. 심벌 타입은 뭐죠?
  3. 데이터 타입은 왜 필요할까요? 🔥
  4. 정적 타이핑이 뭔가요?
  5. 동적 타이핑이 뭔가요?

질문 & 정답 List

데이터 타입 🔥

1. 데이터 타입의 종류는 어떤 것들이 있나요? 🔥

  • Javascript는 느슨한 타입의 동적 언어. 즉, 어떤 특정 타입과 연결되지 않으며 모든 타입의 값으로 할당 가능
  • 변수의 타입 지정 없이 값이 할당되는 과정에서 자동으로 데이터 타입이 결정됨
  1. Javascript 데이터 타입에는 크게 두 가지가 있습니다.
    1. Primitive Type(원시 타입) : 불변값
      1. Boolean
        • falsy 값 : null, undefined, 0
      2. Number
        • 2진수, 8진수, 16진수 데이터 타입 제공 X. 이들 값을 참조하면 모두 10진수로 해석
        • 정수만을 위한 타입이 없고 모두 실수 처리
        • 특별한 값 : Infinity, -Infinity, NaN
      3. String
        • read only로, 문자열 생성 후 바꿀 수 없음
        let str = "Hello";
        str[0] = "h";
        console.log(str); // Hello
        • 0개 이상의 16bit 유니코드(UTF-16)들의 집합
        • 대부분의 전세계의 문자 표현 가능
        • 유사 배열 : 배열처럼 인덱스를 통해 접근 가능
        • 재할당 불가. 기존 문자열을 변경하는 것이 아니라, 새로운 문자열을 새롭게 할당하는 것
      4. null
        • 메모리 어드레스의 참조 정보를 제거하는 것을 의미
      5. Undefined
        • 선언 및 초기화 이후 값이 할당되지 않은 변수가 갖는 값
        • 개발자가 의도적으로 할당하기 위한 값이 아니라, JS 엔진이 변수를 초기화할 때 사용하는 값
      6. Symbol
        • 고유하고 변경 불가능한 원시 값이며, 객체의 속성 키로 사용 가능
      7. BigInt : Number의 최대값(2^53 - 1) 보다 큰 정수를 표현하기 위한 타입
        • 정수 끝에 n을 추가하거나 생성자를 호출해 생성 가능
        • Number와 혼합해 연산 불가. TypeError 발생
    2. Object Type(객체 타입)
      • 데이터(프로퍼티)와 그 데이터에 관련한 동작(메소드)을 모두 포함할 수 있는 개념적 존재
      • 원시 타입을 제외한 모든 것은 모두 객체
      • e.g. Object, Array, Function, RegExp, Date, Math, JSON
      • pass-by-reference(참조에 의한 전달) 방식으로 전달

2. 심벌 타입은 뭐죠?

  • 변경 불가능한 원시 값
  • 매 번 새로운(고유한) 심볼 생성
  • new 연산자를 이용(생성자)한 래퍼 객체 생성 불가
const symbol1 = Symbol("foo");
const symbol2 = Symbol("foo");
console.log(symbol1 === symbol2); // false
  1. 심볼은 주로 객체의 프로퍼티 키로 사용

    • 객체의 키는 대게 문자열(숫자도 문자열로 변환됨)
    const obj = {};
    const foo = Symbol("foo");
    obj[foo] = "bar";
    console.log(obj); // { [Symbol(foo)]: 'bar' }
  2. 내장 심볼

    • 특별한 용도로 사용되기 위해 JS 엔진 내에 미리 생성되어 상수로 존재하고 있는 내장 심볼
    • Symbol 함수의 프로퍼티로서 존재
    • 대표적인 Symbol.iterator : 이터레이터를 반환하는 함수 값
      • 이터레이터 : 순회 가능한 자료 구조(for..of문,map 등)의 요소를 탐색하기 위한 포인터

2. 데이터 타입은 왜 필요할까요? 🔥

  1. 값을 지정할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위하여
  2. 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위하여
  3. 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위하여

3. 정적 타이핑이 뭔가요?

  • 자료형 검사가 컴파일 타임 동안 진행. 즉, 변수의 자료형을 사전에 지정해야 함
  • e.g. C, C++, JAVA
  • 진행 속도 빠름
  • type eorr로 인한 문제점 초기에 발견

4. 동적 타이핑이 뭔가요?

  • 자료형 검사가 런타임 동안 진행. 즉, 변수의 자료형을 사전에 지정하지 않아도 됨
  • e.g. python, Javascript
  • 상대적으로 편함
  • 런타임 도중 예상치 못한 에러 발생할 수 있음
  • 진행 속도가 느림
  • 한 줄 씩 순서대로 기계어로 번역함

궁금증 : 선언, 초기화, 할당 단계가 무엇인가요?

  1. 선언 단계 : 변수 객체에 변수를 등록
    • 이 변수 객체는 스코프가 참조하는 대상이 된다.
  2. 초기화 단계 : 변수 객체에 등록된 변수를 메모리에 할당
    • 이 단계에서 변수는 undefined로 초기화된다.
  3. 할당 단계 : undefined로 초기화된 변수에 실제값을 할당한다.

궁금증 : compile vs runtime

  1. compile : 소스 코드를 작성하고 기계어 코드로 변환되어 실행 가능한 프로그램이 되는 과정
    • compile error : syntex error, type error
      • syntex error : 문법에 맞지 않는 코딩을 했을 경우 발생 e.g. 괄호 누락
      • type error : 타입에 맞지 않는 코딩을 했을 경우 발생 e.g. 문자열에 숫자를 더하기
      • VS Code에서 빨간줄로 표시됨
  2. runtime : 응용프로그램이 동작되어지는 때
    • runtime error : 0나누기 error, null 참조 error, memory 부족 error
      • compile 중에는 감지하지 못하는 에러들

궁금증 : compile vs interpret

  1. compile : programming language를 Runtime 전에 컴퓨터가 알아들을 수 있는 언어(기계어)로 해석
    • Compiler 언어 : 소스코드 전체를 한 번 훑어 컴퓨터가 실행할 수 있도록 바로 기계어로 변환
      • 전체 소스코드를 변환 후 에러 보고
    • e.g. C, C++, JAVA
  2. interpret : Runtime 이후 Row 단위로 해석해 프로그램 구동
    • Interpreter 언어 : Intermediate Code로 변환하고 이를 각 행마다 실행
      • 각 행마다 확인해 에러가 발생되면 즉시 중단 후 에러 보고
    • e.g. Python, Javascript

궁금증 : JS는 컴파일 단계가 없는가?

  • JS는 전통적으로 인터프리터 언어. 웹 브라우저에서 즉시 실행되도록 설계
  • but JS엔진은 인터프리팅과 컴파일링 사이의 다양한 기술 사용
  1. V8같은 현대적인 JS엔진은 JIT(Just In Time)컴파일을 사용하여 코드를 최적화.
    • JIT : 실행 시간 동안 코드를 기계어로 컴파일하는 프로세스 => 컴파일 단계 존재
  2. TS를 JS로 컴파일
  3. Babel을 이용하여 최신 JS를 지원하지 않는 브라우저에서도 실행될 수 있게 JS 코드 변환

Reference